home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib07.dsk
/
INCOME TRAC.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
21KB
|
477 lines
10 REM ********************************
15 REM ** TRAC 'I' **
20 REM ** THE INCOME SYSTEM **
25 REM ** BY CHRIS EXNER **
30 REM ** COPYRIGHT (C) 1982 **
35 REM ** BY MICRO-SPARC INC **
40 REM ** LINCOLN, MA. 01773 **
45 REM ********************************
72 GOTO 100
75 REM REQUIRES APPLESOFT AND 1 DISK. PARALLEL OR SERIAL PRINTER IS OPTIONAL
80 REM ';' PRINTING
81 PRINT SPC( PK -SY)V$;
82 SY = SY +(PK -SY) + LEN(V$)
83 RETURN
85 REM END OF LINE PRINTING
86 PRINT SPC( PK -SY)V$
87 PK = 0:SY = 0
88 RETURN
100 TEXT : HOME : HTAB 11: PRINT "** INCOME TRAC **
110 PRINT : PRINT " THIS SYSTEM ALLOWS YOU TO ENTER"
120 PRINT "INCOME DATA. YOU MAY THEN PRODUCE AN "
130 PRINT "INCOME STATEMENT COMPARING YOUR INCOME"
140 PRINT "TO YOUR EXPENSES. THE EXPENSE DATA IS "
150 PRINT "TAKEN FROM TRAC FILES 'BALANCES',"
160 PRINT "'CARD #' AND 'CHECK #'."
175 REM * ACCEPT OUTPUT DEVICE
180 VTAB 12: PRINT "ENTER THE REPORT OUTPUT DEVICE": PRINT "YOU WISH TO USE."
190 HTAB 10: PRINT "1 = SCREEN ONLY"
195 HTAB 10: PRINT "2 = PRINTER"
200 VTAB 17: INVERSE : INPUT "ENTER YOUR SELECTION: ";PRTYPE: NORMAL : GOSUB 2300
205 IF PRTYPE < >1 AND PRTYPE < >2 THEN GOSUB 2100: GOTO 200
210 IF PRTYPE = 1 THEN 220
215 HOME : VTAB 10: PRINT "ENTER PRINTER TYPE:": PRINT : PRINT "1= IDS & CENTRONICS COMPATIBLE": PRINT "2= CENTRONICS 737": PRINT "3= EPSON MX-80": PRINT : INPUT "ENTER SELECTION: ";PB$: IF VAL(PB$) <0 OR VAL(PB$) >3 THEN 215
220 REM * ACCEPT REPORT DATE
230 VTAB 20: INVERSE : INPUT "ENTER REPORT DATE (MO,DAY,YR):";RMO,RDY,RYR: NORMAL
240 IF (RMO <1 OR RMO >12) OR RDY >31 THEN GOSUB 2100: GOTO 230
300 D$ = CHR$(4): REM CTRL-D
310 DIM ACCT$(49),BAL(49,12)
330 DIM MNAME$(12),W$(200,6)
340 DIM WK(300,5),YTD(49),AVG(49),PRCT(49)
500 ONERR GOTO 5060
1000 REM *** MAIN MENU ***
1010 HOME : HTAB 13: PRINT "* MAIN MENU *"
1020 VTAB 4: PRINT "1 = ENTER ACCOUNT NAMES"
1030 PRINT "2 = ADD INCOME RECORDS"
1040 PRINT "3 = SORT INCOME RECORDS "
1050 PRINT "4 = REPORT/LIST OPTIONS"
1055 PRINT "5 = END"
1060 VTAB 11: INVERSE : INPUT "ENTER YOUR SELECTION: ";OM: NORMAL
1070 IF OM = 1 THEN GOTO 3000
1080 IF OM = 2 THEN GOTO 5000
1090 IF OM = 3 THEN GOTO 7000
1100 IF OM = 4 THEN GOTO 9000
1110 IF OM = 5 THEN END
1120 GOSUB 2100: GOTO 1060
2000 REM ** GENERAL PURPOSE ROUTINES
2100 VTAB 23: PRINT "INVALID ENTRY... PLEASE REENTER": RETURN
2300 VTAB 23: CALL -868: RETURN
2400 Q = P:P = ABS(P)
2410 C = (P > = 10) +(P > = 100) +(P > = 1000) +(P > = 10000)
2420 IF Q <0 THEN C = C +1
2430 RETURN
2500 REM *ADD DETAIL FILE
2501 F$ = "INCOME #"
2505 ONERR GOTO 2560
2510 FLASH : PRINT "READING ";F$;" FILE": NORMAL
2515 PRINT D$"OPEN ";F$;",L40"
2520 PRINT D$"READ ";F$;",R0"
2525 INPUT R
2527 IF R = 0 THEN 2555
2530 FOR X = 1 TO R
2535 PRINT D$"READ ";F$;",R";X
2540 INPUT A,CNO$,MO$,DY$,AMT
2542 MO = VAL(MO$)
2545 BAL(A,MO) = BAL(A,MO) +AMT
2550 NEXT X
2555 GOTO 2570
2560 REM * DETAIL FILE ERR RTN
2565 ER = PEEK(222): POKE 216,0: IF ER < >5 THEN GOTO 2900
2570 PRINT D$"CLOSE ";F$
2575 IF SW = 1 THEN SW = 0: GOTO 10040: REM RETURN TO PROFILE
2580 IF F$ = "INCOME #" THEN F$ = "CHECK #": GOTO 2505
2590 IF F$ = "CHECK #" THEN F$ = "CARD #": GOTO 2505
2595 GOTO 9380: REM RETURN TO INCOME STATEMENT
2800 VTAB 24: INVERSE : INPUT "HIT RETURN FOR NEXT PAGE";X$: NORMAL : HOME :PGCT = 0
2810 RETURN
2850 POKE 36,8: PRINT "** INCOME STATEMENT ** ";RMO;"/";RDY;"/";RYR
2860 PRINT : POKE 36,12: PRINT MNAME$(CMO);" AVG %AVG YTD": PRINT :PGCT = 4: RETURN
2900 PRINT "CHECK APPLESOFT MANUAL PG.136 FOR ERR."
2910 PRINT "THE ERROR IS #"; PEEK(222);"LOCATED IN LINE# "; PEEK(218) + PEEK(219) *256
2920 END
3000 REM ****** LOAD ACCOUNT TABLE ROUTINE
3010 ONERR GOTO 3900
3020 FLASH : PRINT "LOAD ACCOUNTS ": NORMAL :X = 1
3030 PRINT D$"OPEN ACCOUNTS,L30"
3040 PRINT D$"READ ACCOUNTS,R0"
3050 INPUT R
3060 FOR X = 1 TO 49
3070 PRINT D$"READ ACCOUNTS,R";X
3080 INPUT ACCT$(X)
3090 NEXT X
3100 PRINT D$"CLOSE ACCOUNTS"
3110 IF SW = 1 THEN SW = 0: GOTO 5005: REM ADD INCOME INCOME RCDS
3120 IF SW = 2 THEN SW = 0: GOTO 9110: REM LIST ACCTS
3130 IF SW = 3 THEN SW = 0: GOTO 9385: REM INCOME ST.
3140 IF SW = 4 THEN SW = 0: GOTO 10050: REM PROFILE RPT
3500 REM * ENTER ACCOUNT NAME
3510 HOME : HTAB 8: PRINT "** ENTER ACCOUNT NAMES **"
3520 VTAB 4: INVERSE : PRINT "VALID EXPENSE ACCOUNT #'S ARE 1-24 ": PRINT "VALID INCOME ACCOUNT #'S ARE 30-49"
3525 PRINT "TYPE 'END' FOR MAIN MENU": NORMAL
3530 VTAB 9: CALL -868: INPUT "ACCOUNT NO:";A$: GOSUB 2300
3540 IF A$ = "END" THEN GOTO 3700
3550 A = INT( VAL(A$))
3560 IF A <1 OR (A >24 AND A <30) OR A >49 THEN GOSUB 2100: GOTO 3530
3565 IF ACCT$(A) = "" THEN GOTO 3610
3570 VTAB 11: CALL -868: PRINT "ACCOUNT NAME: ";ACCT$(A)
3580 VTAB 23: INVERSE : INPUT "ANY CHANGE? (Y/N) ";X$: NORMAL
3590 IF X$ = "N" THEN GOTO 3530
3600 IF X$ < >"Y" THEN GOSUB 2100: GOTO 3580
3610 VTAB 11: CALL -868: INPUT "ACCOUNT NAME: ";ACCT$(A)
3620 IF LEN(ACCT$(A)) <1 OR LEN(ACCT$(A)) >16 THEN VTAB 23: PRINT "NAME LENGTH MUST BE 1-16": GOTO 3610
3630 GOTO 3530
3700 REM * WRITE OUT ACCOUNTS
3710 ONERR GOTO 2900
3715 FLASH : PRINT "WRITING ACCOUNTS FILE": NORMAL
3720 PRINT D$"OPEN ACCOUNTS,L30"
3730 PRINT D$"WRITE ACCOUNTS,R0"
3740 PRINT R
3750 FOR X = 1 TO 49
3760 PRINT D$"WRITE ACCOUNTS,R";X
3770 PRINT ACCT$(X): NEXT X
3780 PRINT D$"CLOSE ACCOUNTS"
3790 GOTO 1000: REM RETURN TO MAIN MENU
3900 REM * ACCOUNTS ERROR RTN
3910 ER = PEEK(222): POKE 216,0: IF ER < >5 THEN 2900
3920 PRINT D$"CLOSE ACCOUNTS"
3930 FOR Y = X TO 49:ACCT$(X) = "": NEXT Y
3940 R = 49
3950 GOTO 3110
5000 REM ****** ENTER INCOME RECORDS
5002 SW = 1: GOTO 3000: REM LOAD ACCT NAMES
5005 ONERR GOTO 5060
5030 PRINT D$"OPEN INCOME #,L40"
5040 PRINT D$"READ INCOME #,R0"
5050 INPUT R: GOTO 5080
5060 ER = PEEK(222): POKE 216,0: IF ER < >5 THEN GOTO 2900
5070 R = 0
5080 PRINT D$"CLOSE INCOME #"
5095 I = R
5100 HOME : HTAB 9: PRINT "* ADD INCOME RECORD *"
5110 PRINT : FOR X = 30 TO 39: PRINT X;". ";ACCT$(X);: HTAB 20: PRINT X +10;". ";ACCT$(X +10): NEXT X
5130 PRINT : INVERSE : PRINT "INCOME ACCT #'S ARE 30-49": PRINT "TYPE ACCOUNT #, 'REDO', 'EDIT', OR 'END'": NORMAL
5140 I = I +1
5150 VTAB 18: CALL -868: PRINT "REC #";I
5160 VTAB 19: CALL -868: INVERSE : INPUT "ACCOUNT # ";W$(I,1)
5170 GOSUB 2300
5180 IF W$(I,1) = "END" THEN NORMAL :I = I -1: GOTO 5400
5190 IF W$(I,1) = "REDO" THEN I = I -1: GOTO 5150
5200 IF W$(I,1) = "EDIT" THEN IS = I: INPUT "RECORD # TO EDIT? ";I:W$(IS,1) = "": GOTO 5150
5210 W = VAL(W$(I,1)): IF W <30 OR W >50 THEN GOSUB 2100: GOTO 5160
5220 W$(I,2) = "0": REM FOR CONSISTANCY W/ OTHER TRAC DATA FILES, THE CARD/CHECK FIELD IS PLACE-HELD.
5230 VTAB 20: CALL -868: INPUT "MONTH,DAY:";W$(I,3),W$(I,4)
5240 GOSUB 2300
5250 WM = VAL(W$(I,3)):WD = VAL(W$(I,4)): IF WM <1 OR WM >12 OR WD >31 THEN GOSUB 2100: GOTO 5230
5260 VTAB 21: CALL -868: PRINT "REFERENCE: ";: NORMAL : PRINT "--------------";: HTAB 12: INVERSE : INPUT "";W$(I,6)
5270 GOSUB 2300
5280 IF W$(I,6) = "" THEN W$(I,6) = " "
5290 IF LEN(W$(I,6)) <1 OR LEN(W$(I,6)) >14 THEN VTAB 24: PRINT "MAX 14 CHAR ALLOWED... PLEASE REENTER": GOTO 5260
5300 VTAB 22: CALL -868: INPUT "AMOUNT: ";W$(I,5)
5310 GOSUB 2300
5320 IF ASC(W$(I,5)) <48 OR ASC(W$(I,5)) >57 THEN VTAB 24: PRINT "NOT A NUMBER...PLEASE REENTER": GOTO 5300
5330 VTAB 17: CALL -958: PRINT "LAST ACCT=";W$(I,1);" MONTH= ";W$(I,3);" AMT=$";W$(I,5)
5340 IF IS >0 THEN X = I: GOSUB 5400:I = IS:IS = 0: GOTO 5150
5380 GOTO 5140
5400 REM * WRITE INCOME RECORDS
5410 PRINT D$"OPEN INCOME #,L40"
5420 IF IS >0 THEN 5460: REM DIRECT EDIT
5430 PRINT D$"WRITE INCOME #,R0"
5440 PRINT I
5450 FOR X = R +1 TO I
5460 PRINT D$"WRITE INCOME #,R";X
5470 PRINT W$(X,1): PRINT W$(X,2): PRINT W$(X,3): PRINT W$(X,4): PRINT W$(X,5): PRINT W$(X,6)
5880 IF IS >0 THEN 5900
5890 NEXT X
5900 PRINT D$;"CLOSE INCOME #"
5910 IF IS >0 THEN RETURN
5915 IF SW = 2 THEN SW = 0: GOTO 7440: REM RETURN TO SORT RTN
5920 GOTO 1000: REM RETURN TO MAIN MENU
7000 REM ****** SORT INCOME RECORDS
7010 REM * READ INCOME FILE RTN
7015 R = 0: ONERR GOTO 7104
7020 FLASH : PRINT "READING INCOME #": NORMAL
7030 PRINT D$"OPEN INCOME #,L40"
7040 PRINT D$"READ INCOME #,R0"
7050 INPUT R
7060 IF R = 0 THEN GOTO 7106
7070 FOR X = 1 TO R
7080 PRINT D$"READ INCOME #,R";X
7090 INPUT W$(X,1),W$(X,2),W$(X,3),W$(X,4),W$(X,5),W$(X,6)
7100 NEXT X
7102 GOTO 7110
7104 ER = PEEK(222): POKE 216,0: IF ER < >5 OR R < >0 THEN GOTO 2900
7106 INVERSE : PRINT "NO RECORDS STORED IN INCOME# FILE": NORMAL : FOR X = 1 TO 1500: NEXT X: GOTO 1000
7110 PRINT D$"CLOSE INCOME #"
7120 IF SW = 1 THEN SW = 0: GOTO 9820
7200 REM * ENTER SORT PARAMETERS
7205 HOME : HTAB 7: PRINT "* ENTER SORT PARAMETERS *"
7210 PRINT : PRINT "WHICH FIELD DO YOU WANT TO SORT ON?"
7220 HTAB 10: PRINT "1 = ACCOUNT NUMBER"
7230 HTAB 10: PRINT "3 = MONTH"
7240 HTAB 10: PRINT "5 = DOLLAR AMOUNT"
7250 VTAB 7: INVERSE : INPUT "ENTER YOUR SELECTION: ";SR: NORMAL
7260 IF SR = 1 THEN A$ = "BY ACCOUNT NUMBER"
7270 IF SR = 3 THEN A$ = "BY MONTH"
7275 IF SR = 5 THEN A$ = "BY DOLLAR AMOUNT"
7280 IF SR < >1 AND SR < >3 AND SR < >5 THEN GOSUB 2100: GOTO 7250
7285 FLASH : PRINT "INITIALIZING SORT VARIABLES": NORMAL
7290 H = 0:K = 0:J = 0:V = 0:CM = 0:F = 0
7295 FOR X = R +1 TO 300: FOR N = 1 TO 5:WK(X,N) = 0: NEXT N,X
7300 FOR X = 1 TO R: FOR N = 1 TO 5:WK(X,N) = VAL(W$(X,N)): NEXT N,X: REM CONVERT STRINGS TO DIGITS
7305 FLASH : PRINT "SORT IN PROGRESS": NORMAL
7310 M = R: REM ** SORT ROUTINE
7312 M = INT(M/2): IF M = 0 THEN 7395
7320 J = 1:K = R -M
7325 H = J
7330 V = H +M:CM = CM +1
7340 IF WK(H,SR) <WK(V,SR) THEN 7387
7350 FOR F = 1 TO 5
7355 TK = WK(H,F):WK(H,F) = WK(V,F):WK(V,F) = TK
7370 NEXT F
7372 T$ = W$(H,6):W$(H,6) = W$(V,6):W$(V,6) = T$
7375 H = H -M
7380 IF H <1 THEN 7387
7385 GOTO 7330
7387 J = J +1
7389 IF J >K THEN 7312
7391 GOTO 7325
7395 FLASH : PRINT "SORT COMPLETED": NORMAL
7400 FOR X = 1 TO R: FOR N = 1 TO 5:W$(X,N) = STR$(WK(X,N)): NEXT N,X:I = R
7410 I = R:R = 0:IS = 0: VTAB 10: PRINT "SAVE SORTED LIST ON THE DISK? ": INVERSE : INPUT "ENTER 'Y' OR 'N': ";X$: NORMAL : GOSUB 2300
7420 IF X$ = "Y" THEN SW = 2: GOTO 5400: REM WRITE INCOME RCDS
7430 IF X$ < >"Y" AND X$ < >"N" THEN GOSUB 2100: GOTO 7410
7440 R = I: VTAB 13: PRINT "PRINT SORTED LIST ON PRINTER? ": INVERSE : INPUT "ENTER 'Y' OR 'N': ";X$: NORMAL : GOSUB 2300
7450 IF X$ = "Y" THEN GOTO 9820
7460 IF X$ < >"Y" AND X$ < >"N" THEN GOSUB 2100: GOTO 7440
7470 GOTO 1000: REM MAIN MENU
9000 REM ****** REPORT OPTIONS
9010 HOME : HTAB 10: PRINT "** REPORT OPTIONS **"
9020 PRINT : PRINT "1 = LIST ACCOUNTS"
9025 PRINT "2 = LIST INCOME RECORDS"
9030 PRINT "3 = INCOME STATEMENT"
9040 PRINT "4 = YTD INCOME PROFILE"
9050 VTAB 8: INVERSE : INPUT "ENTER SELECTION: ";RP: NORMAL : GOSUB 2300
9055 IF RP = 1 THEN GOTO 9100
9060 IF RP = 2 THEN GOTO 9800
9065 IF RP < >3 AND RP < >4 THEN GOSUB 2100: GOTO 9050
9067 RESTORE : FOR X = 1 TO 12: READ MNAME$(X): NEXT X
9068 IF RP = 4 THEN GOTO 10000: REM PROFILE RPT
9069 VTAB 9: PRINT "%AVG COLUMN IS (CURRMO -AVG MO)/AVG MO"
9070 BMO = 1: REM CHANGE THIS LINE TO FIT YOUR FISCAL YEAR SET-UP
9075 VTAB 11: PRINT "YOUR FISCAL YEAR BEGINS WITH ";MNAME$(BMO)
9080 VTAB 14: INVERSE : INPUT "ENTER THE CURRENT MONTH#: ";CMO: GOSUB 2300: VTAB 16
9085 CMO = INT(CMO): IF CMO <1 OR CMO >12 THEN GOSUB 2100: GOTO 9080
9090 GOTO 9300: REM INCOME STATE.
9100 REM ** LIST ACCOUNTS
9105 SW = 2: GOTO 3000: REM LOAD ACCT NAMES
9110 IF PRTYPE = 2 THEN GOTO 9200: REM LIST ACCOUNTS ON PRINTER
9115 REM * LIST ACCTS ON SCREEN
9120 A = 0
9125 HOME : HTAB 11: PRINT "* LIST ACCOUNTS *"
9130 PRINT : PRINT "ACCT# ACCT NAME"
9135 FOR X = 0 TO 39: PRINT "=";: NEXT X: PRINT
9140 PGCT = 0
9145 PGCT = PGCT +1
9150 IF PGCT >17 THEN VTAB 24: INVERSE : INPUT "HIT RETURN FOR NEXT PAGE ";X$: NORMAL : GOTO 9125
9155 A = A +1
9160 IF A >49 THEN GOTO 9175
9165 IF ACCT$(A) = "" THEN GOTO 9155: REM SKIP UNUSED ACCTS
9170 HTAB 3: PRINT A;: HTAB 9: PRINT ACCT$(A): GOTO 9145
9175 VTAB 24: INVERSE : INPUT "HIT RETURN FOR MAIN MENU";X$: NORMAL : GOTO 1000
9200 REM ** LIST ACCTS ON PRINTER
9205 PRINT D$;"PR#1"
9210 PRINT CHR$(9);"40N"
9215 PRINT CHR$(2); CHR$(30)
9220 PRINT TAB( 11);"* LIST ACCOUNTS * ";RMO;"/";RDY;"/";RYR
9230 PRINT : PRINT "ACCT# ACCT NAME"
9235 FOR X = 1 TO 39: PRINT "=";: NEXT X: PRINT
9240 FOR A = 1 TO 49
9245 IF ACCT$(A) = "" THEN GOTO 9260: REM SKIP UNUSED ACCTS
9250 POKE 36,3: PRINT A;
9255 POKE 36,9: PRINT ACCT$(A)
9260 NEXT A
9265 PRINT CHR$(9);"40N"
9270 PRINT D$;"PR#0"
9275 TEXT : GOTO 1000: REM RETURN TO MAIN MENU
9300 REM * INCOME STATEMENT
9305 REM * GATHER ACTUAL EXPENSES RTN
9307 FOR X = 30 TO 49: FOR N = 1 TO 12:BAL(X,N) = 0: NEXT N,X
9310 REM * READ YTD BALANCES
9315 ONERR GOTO 9355
9320 FLASH : PRINT "READING YEAR-TO-DATE FILES": NORMAL
9325 PRINT D$"OPEN BALANCES"
9330 PRINT D$"READ BALANCES"
9335 FOR X = 1 TO 24: FOR N = 1 TO 12
9340 INPUT BAL(X,N)
9345 NEXT N,X
9350 GOTO 9365
9355 REM YTD ERROR RTN
9360 ER = PEEK(222): POKE 216,0: IF ER < >5 THEN 2900
9365 PRINT D$"CLOSE BALANCES"
9370 GOTO 2500: REM ADD DETAIL FILES
9380 SW = 3: GOTO 3000: REM LOAD ACCT NAMES
9385 REM *CALC YTD AMTS
9390 FOR A = 1 TO 49
9392 YTD(A) = 0
9395 IF BMO < = CMO THEN FOR M = BMO TO CMO:YTD(A) = YTD(A) +BAL(A,M): NEXT M
9400 IF BMO >CMO THEN FOR M = BMO TO 12:YTD(A) = YTD(A) +BAL(A,M): NEXT M: FOR M = 1 TO CMO:YTD(A) = YTD(A) +BAL(A,M): NEXT M
9405 NEXT A
9410 IF BMO < = CMO THEN MCT = (CMO -BMO) +1
9415 IF BMO >CMO THEN MCT = (13 -BMO) +CMO
9420 FOR A = 1 TO 49: REM CALC AVG MONTHS & PERCENTAGES
9425 AVG(A) = INT((YTD(A)/MCT) +.5)
9430 PRCT(A) = 0: IF AVG(A) < >0 THEN PRCT(A) = (BAL(A,CMO) -AVG(A))/AVG(A)
9435 PRCT(A) = INT(PRCT(A) *100 +.5)
9440 NEXT A
9442 REM * PRINT INCOME STATEMENT
9445 IF PRTYPE = 1 THEN HOME : GOTO 9455: REM SKIP TURNING PRINTER ON
9447 PRINT D$;"PR#1"
9450 PRINT CHR$(9);"40N"
9452 PRINT CHR$(2); CHR$(30)
9455 GOSUB 2850: REM PAGE HEADING
9460 POKE 36,0: PRINT "## INCOME ##": PRINT " ":PGCT = PGCT +2
9465 TC = 0:TY = 0:TA = 0: REM INIT GROSS INCOME LINES
9470 FOR A = 30 TO 49: GOSUB 9600: NEXT A
9475 IC = TC:IY = TY:IA = TA: REM SAVE GROSS TOTALS
9480 TD = 0: IF IA < >0 THEN TD = INT((IC -IA)/IA *100)
9485 PRINT "*GROSS";
9490 HTAB 10: FOR X = 11 TO 39: PRINT "=";: NEXT X: PRINT
9495 PK = 0:V$ = "*INCOME*": GOSUB 80: GOSUB 9665:PGCT = PGCT +2
9500 IF PRTYPE = 1 AND PGCT >16 THEN GOSUB 2800: GOSUB 2850
9502 PRINT " ": PRINT "## EXPENSES ##": PRINT :PGCT = PGCT +3
9505 TA = 0:TC = 0:TY = 0
9510 FOR A = 1 TO 24: GOSUB 9600: NEXT A
9515 EC = TC:EY = TY:EA = TA: REM SAVE TOTAL EXPENSES
9520 TD = 0: IF EA < >0 THEN TD = INT((EC -EA)/EA *100)
9525 PRINT "*TOTAL";
9530 HTAB 10: FOR X = 11 TO 39: PRINT "=";: NEXT X: PRINT " "
9540 PK = 0:V$ = "*EXPENSE*": GOSUB 80: GOSUB 9665:PGCT = PGCT +2
9545 IF PRTYPE = 1 AND PGCT >18 THEN GOSUB 2800: GOSUB 2850
9550 TC = IC -EC:TC = INT(TC *100 +.5)/100
9551 TA = IA -EA:TA = INT(TA *100 +.5)/100
9552 TY = IY -EY:TY = INT(TY *100 +.5)/100
9555 TD = 0: IF TA < >0 THEN TD = ((TC -TA)/TA) *100
9557 TD = INT(TD +.5)
9560 PRINT " ": PRINT "*NET";
9565 HTAB 10: FOR X = 11 TO 39: PRINT "*";: NEXT X: PRINT
9570 PK = 0:V$ = "*INCOME*": GOSUB 80: GOSUB 9665
9575 HTAB 10: FOR X = 11 TO 39: PRINT "*";: NEXT X: PRINT " "
9577 IF PRTYPE = 2 THEN GOTO 9590
9580 VTAB 24: INVERSE : PRINT "ANY KEY FOR MENU, 'ESC' FOR 1ST PAGE";: GET X$: NORMAL
9582 IF ASC(X$) = 27 THEN GOTO 9442
9585 TEXT : GOTO 1000: REM MAIN MENU
9590 PRINT CHR$(9);"40N"
9592 PRINT D$;"PR#0"
9595 TEXT : GOTO 1000
9600 REM PRINT DETAIL LINES
9605 IF ACCT$(A) = "" AND YTD(A) = 0 THEN RETURN
9610 PK = 1:V$ = STR$(A): GOSUB 80
9612 PK = 4:V$ = LEFT$(ACCT$(A),6): GOSUB 80
9613 BAL(A,CMO) = INT(BAL(A,CMO) *100 +.05)/100
9615 P = BAL(A,CMO): GOSUB 2400:PK = 14 -C:V$ = STR$(BAL(A,CMO)): GOSUB 80
9620 TC = TC +BAL(A,CMO)
9625 P = AVG(A): GOSUB 2400:PK = 22 -C:V$ = STR$(AVG(A)): GOSUB 80
9630 TA = TA +AVG(A)
9635 P = PRCT(A): GOSUB 2400:PK = 29 -C:V$ = STR$(PRCT(A)): GOSUB 80
9640 P = YTD(A): GOSUB 2400:PK = 35 -C:V$ = STR$(YTD(A)): GOSUB 85
9645 TY = TY +YTD(A)
9650 PGCT = PGCT +1: IF PRTYPE = 1 AND PGCT >20 THEN GOSUB 2800: GOSUB 2850
9655 RETURN
9665 REM *PRINT TOTAL LINES
9670 P = TC: GOSUB 2400:PK = 14 -C:V$ = STR$(TC): GOSUB 80
9675 P = TA: GOSUB 2400:PK = 22 -C:V$ = STR$(TA): GOSUB 80
9680 P = TD: GOSUB 2400:PK = 29 -C:V$ = STR$(TD): GOSUB 80
9685 P = TY: GOSUB 2400:PK = 35 -C:V$ = STR$(TY): GOSUB 85
9690 RETURN
9800 REM ** LIST INCOME RECORDS
9810 SW = 1: GOTO 7010: REM GET INCOME RCDS
9820 IF PRTYPE = 1 THEN HOME : GOTO 9860: REM SKIP TURNING ON PRINTER
9830 PRINT D$;"PR#1"
9840 PRINT CHR$(9);"40N"
9845 IF PB$ = "1" THEN PRINT CHR$(2); CHR$(30)
9850 IF PB$ = "2" THEN PRINT CHR$(27); CHR$(19)
9855 IF PB$ = "3" THEN PRINT CHR$(30)
9860 A = 0:TA = 0
9865 IF PRTYPE = 1 THEN HOME : GOTO 9875: REM SKIP TURNING ON PRINTER
9868 PRINT D$;"PR#1"
9870 PRINT CHR$(9);"40N"
9872 PRINT CHR$(2); CHR$(30)
9875 A = 0:TA = 0
9880 PRINT TAB( 11);"* INCOME RECORDS *";" ";RMO;"/";RDY;"/";RYR
9885 IF OM = 3 THEN PRINT TAB( 7);"SORTED ";A$
9890 PRINT : PRINT "# * REFERENCE * A# MM/DD AMT"
9895 FOR X = 1 TO 40: PRINT "=";: NEXT X: PRINT
9900 PGCT = 0
9905 PGCT = PGCT +1
9910 IF PRTYPE = 1 AND PGCT >16 THEN GOSUB 2800: HOME : GOTO 9880: REM NEW PAGE
9915 A = A +1: IF A >R THEN GOTO 9955
9920 PK = 1:V$ = STR$(A): GOSUB 80
9925 PK = 5:V$ = W$(A,6): GOSUB 80
9930 PK = 20:V$ = W$(A,1): GOSUB 80
9935 PK = 24:V$ = W$(A,3) +"/" +W$(A,4): GOSUB 80
9940 W = VAL(W$(A,5)):TA = TA +W
9945 P = W: GOSUB 2400:PK = 36 -C:V$ = STR$(W): GOSUB 85
9950 GOTO 9905
9955 PRINT :PK = 22:V$ = "*TOTALS*": GOSUB 80
9960 P = TA: GOSUB 2400:PK = 36 -C:V$ = STR$(TA): GOSUB 85
9965 IF PRTYPE = 1 THEN VTAB 24: INVERSE : INPUT "HIT RETURN FOR MAIN MENU";X$: NORMAL : TEXT : GOTO 1000
9970 PRINT CHR$(9);"40N"
9975 PRINT D$;"PR#0"
9980 TEXT : GOTO 1000
10000 REM ****** INCOME PROFILE
10010 TEXT : FOR X = 30 TO 49: FOR N = 1 TO 12:BAL(X,N) = 0: NEXT N,X
10020 FOR X = 1 TO 12:YTD(X) = 0: NEXT X: REM USE FOR MONTH TOTALS
10030 SW = 1: GOTO 2500: REM ADD INCOME DETAIL
10040 SW = 4: GOTO 3000: REM LOAD ACCT NAMES
10050 IF PRTYPE = 1 THEN GOSUB 12000: REM SCREEN PROFILE RPT
11000 REM *** PRINTER PROFILE REPORT
11010 PRINT D$;"PR#1"
11020 PRINT CHR$(9);"130N"
11025 IF PB$ = "1" THEN PRINT CHR$(2); CHR$(31)
11030 IF PB$ = "2" THEN PRINT CHR$(27); CHR$(20)
11035 IF PB$ = "3" THEN PRINT CHR$(15)
11100 PK = 50:V$ = "YEAR-TO-DATE INCOME PROFILE " + STR$(RMO) +"/" + STR$(RDY) +"/" + STR$(RYR): GOSUB 85
11110 POKE 36,0: PRINT : PRINT "INCOME DESCR' "; TAB( 10);MNAME$(1);
11120 FOR X = 2 TO 12: PRINT TAB( 07);MNAME$(X);: NEXT X: PRINT
11130 FOR X = 1 TO 130: PRINT "=";: NEXT X: PRINT
11200 FOR A = 30 TO 49
11210 IF ACCT$(A) = "" THEN Y = 0: FOR X1 = 1 TO 12:Y = BAL(A,X1) +Y: NEXT X1: IF Y = 0 THEN GOTO 11280
11220 PK = 1:V$ = ACCT$(A): GOSUB 80
11230 FOR X = 1 TO 12
11235 BAL(A,X) = INT(BAL(A,X) *100 +.05)/100
11240 IF BAL(A,X) = 0 THEN GOTO 11270
11250 P = BAL(A,X): GOSUB 2400:PK = (X *9) +15 -C:V$ = STR$(BAL(A,X)): GOSUB 80
11260 YTD(X) = YTD(X) +BAL(A,X)
11270 NEXT X:PK = 0:SY = 0: PRINT
11280 NEXT A
11290 FOR X = 1 TO 130: PRINT "=";: NEXT X: PRINT
11300 PK = 1:V$ = "** TOTALS **": GOSUB 80
11310 FOR X = 1 TO 12:P = YTD(X): GOSUB 2400:PK = (X *9) +15 -C:V$ = STR$(YTD(X)): GOSUB 80: NEXT X:PK = 0:SY = 0: PRINT
11335 IF PB$ = "1" THEN PRINT CHR$(2); CHR$(30): REM TURN OFF CONDENSED PRINT
11340 IF PB$ = "2" THEN PRINT CHR$(27); CHR$(19)
11345 IF PB$ = "3" THEN PRINT CHR$(146): REM TURN OFF CONDENSED PRINT
11350 PRINT CHR$(9);"40N"
11360 PRINT D$;"PR#0"
11400 TEXT : GOTO 1000
12000 REM *** SCREEN PROFILE REPORT
12010 FOR X = 1 TO 12 STEP 3
12020 HOME : HTAB 8: PRINT "** YTD INCOME PROFILE **": PRINT
12030 PRINT "INCOME DESC ";MNAME$(X);" ";MNAME$(X +1);" ";MNAME$(X +2): PRINT
12040 FOR A = 30 TO 49
12050 IF ACCT$(A) = "" THEN Y = 0: FOR X1 = X TO (X +2):Y = Y +BAL(A,X1): NEXT X1: IF Y = 0 THEN GOTO 12130
12060 PK = 0:V$ = LEFT$(ACCT$(A),12): GOSUB 80
12070 P = BAL(A,X): GOSUB 2400:PK = 16 -C:V$ = STR$(BAL(A,X)): GOSUB 80
12080 P = BAL(A,X +1): GOSUB 2400::PK = 26 -C:V$ = STR$(BAL(A,X +1)): GOSUB 80
12090 P = BAL(A,X +2): GOSUB 2400:PK = 36 -C:V$ = STR$(BAL(A,X +2)): GOSUB 85
12100 YTD(X) = YTD(X) +BAL(A,X)
12110 YTD(X +1) = YTD(X +1) +BAL(A,X +1)
12120 YTD(X +2) = YTD(X +2) +BAL(A,X +2)
12130 NEXT A
12200 PRINT " ":PK = 0:V$ = "** TOTALS **": GOSUB 80
12205 P = YTD(X): GOSUB 2400:PK = 16 -C:V$ = STR$(YTD(X)): GOSUB 80
12210 P = YTD(X +1): GOSUB 2400:PK = 26 -C:V$ = STR$(YTD(X +1)): GOSUB 80
12220 P = YTD(X +2): GOSUB 2400:PK = 36 -C:V$ = STR$(YTD(X +2)): GOSUB 85
12240 VTAB 23: INVERSE : PRINT "HIT ANY KEY TO CONTINUE";: GET X$: NORMAL
12250 NEXT X
12300 TEXT : GOTO 1000
20000 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC